package com.cfpamf.ms.insur.wx.response;


import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 下载资金账单
 * <p/>
 * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_18&index=7
 * <p/>
 * <p>
 * 商户可以通过该接口下载自2017年6月1日起 的历史资金流水账单。
 * 说明：
 * 1、资金账单中的数据反映的是商户微信账户资金变动情况；
 * 2、当日账单在次日上午9点开始生成，建议商户在上午10点以后获取；
 * 3、资金账单中涉及金额的字段单位为“元”。
 */
@Data
public class WxPayDownloadFundflowResponse extends WxPayResponse {
    //格式化
    private static final DateTimeFormatter TIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    //逗号分隔
    private static final String CSV_SEPARATOR = ",";
    private static final String FIRST_HEAD_STR = "记账时间,微信支付业务单号,资金流水单号,业务名称,业务类型,收支类型,收支金额(元),账户结余(元),资金变更提交申请人,备注,业务凭证号";
    private static final String LAST_HEAD_STR = "资金流水总笔数,收入笔数,收入金额,支出笔数,支出金额";

    private List<WechatFundflow> datas;

    private int trxCount;

    private int inCount;

    //y元
    private BigDecimal inAmt;

    private int outCount;

    private BigDecimal outAmt;

    //TODO 分页对数
//    public static List<WechatFundflow> parse(BufferedReader reader, WxPayDownloadFundflowResponse resp) {
//
//        try {
//            String text = reader.readLine();
//            if (!isHead(text)) {
//                throw new IllegalArgumentException("表头格式错误:" + text);
//            }
//            while ((text = reader.readLine()) != null) {
//
//                if (isSummaryHead(text)) {
//                    String summary = reader.readLine();
//                    break;
//                }
//                //解析数据
//            }
//
//        } catch (IOException e) {
//
//        } finally {
//        }
//    }

    /**
     * 是否流水表头
     *
     * @param str
     * @return
     */
    private static boolean isHead(String str) {
        return Objects.equals(FIRST_HEAD_STR, str);
    }

    /**
     * 是否统计的表头
     *
     * @param str
     * @return
     */
    private static boolean isSummaryHead(String str) {
        return Objects.equals(LAST_HEAD_STR, str);
    }

    /**
     * 接口请求成功时，数据以文本表格的方式返回
     * 1）第一行为表头
     * <p>
     * 记账时间,微信支付业务单号,资金流水单号,业务名称,业务类型,收支类型,收支金额（元）,账户结余（元）,资金变更提交申请人,备注,业务凭证号
     * <p>
     * 2)从第二行起，为资金流水数据，各参数以逗号分隔，参数前增加`符号，为标准键盘1左边键的字符，字段顺序与表头一致
     * <p>
     * 3）倒数第二行为资金账单统计标题
     * <p>
     * 资金流水总笔数,收入笔数,收入金额,支出笔数,支出金额
     * <p>
     * 4）最后一行为统计数据
     *
     * @param datas
     * @param resp
     * @return
     */
    public static List<WechatFundflow> parse(List<String> datas, WxPayDownloadFundflowResponse resp) {
        //至少有两行头以及一行汇总数据
        if (CollectionUtils.isEmpty(datas) || datas.size() < 3) {
            return Collections.emptyList();
        }

        int size = datas.size();

        //第一行 和倒数第二行应该是固定的格式
        if (Objects.equals(datas.get(0), FIRST_HEAD_STR) && Objects.equals(datas.get(size - 2), LAST_HEAD_STR)) {
            throw new IllegalArgumentException("解析微信数据出错第一行以及倒数第二行格式错误");
        }

        String summary = datas.get(size - 1);
        String[] split = StringUtils.split(summary, CSV_SEPARATOR);
        if (Objects.isNull(split) || split.length != 5) {
            throw new IllegalArgumentException("统计数据格式错误");
        } else {
            //资金流水总笔数,收入笔数,收入金额,支出笔数,支出金额,
            // `2,`1,`0.01,`1,`0.07
            resp.trxCount = Integer.parseInt(split[0].replaceFirst("`", ""));
            resp.inCount = Integer.parseInt(split[1].replaceFirst("`", ""));
            resp.inAmt = new BigDecimal(split[2].replaceFirst("`", ""));
            resp.outCount = Integer.parseInt(split[3].replaceFirst("`", ""));
            resp.outAmt = new BigDecimal(split[4].replaceFirst("`", ""));
        }
        // 解析流水明细 跳过第一行 标题 以及最后两行的汇总数据
        List<WechatFundflow> trxes = Lists.newArrayListWithCapacity(size - 3);
        for (int i = 1; i < size - 2; i++) {
            WechatFundflow wechatFundflow = new WechatFundflow();
            String s = datas.get(i);
            String[] trxData = s.split(CSV_SEPARATOR);
            wechatFundflow.setTrxTime(LocalDateTime.parse(trxData[0].replaceFirst("`", ""), TIME_FMT));
            wechatFundflow.setWechatBizNo(trxData[1].replaceFirst("`", ""));
            wechatFundflow.setWechatTrxNo(trxData[2].replaceFirst("`", ""));
            wechatFundflow.setBizName(trxData[3].replaceFirst("`", ""));
            wechatFundflow.setBizType(trxData[4].replaceFirst("`", ""));
            wechatFundflow.setFundType(trxData[5].replaceFirst("`", ""));
            wechatFundflow.setFundAmt(new BigDecimal(trxData[6].replaceFirst("`", "")));
            wechatFundflow.setAccountBalance(new BigDecimal(trxData[7].replaceFirst("`", "")));
            wechatFundflow.setProposer(trxData[8].replaceFirst("`", ""));
            wechatFundflow.setRemark(trxData[9].replaceFirst("`", ""));
            //可以重写一个list add 到一定数量就去对数 改动就比较小了
            trxes.add(wechatFundflow);
        }
        resp.setDatas(trxes);
        return trxes;

    }

    //[﻿记账时间,微信支付业务单号,资金流水单号,业务名称,业务类型,收支类型,收支金额(元),账户结余(元),资金变更提交申请人,备注,业务凭证号,
    // `2018-06-30 06:23:52,`10900966053622018063000406910002,`21612433011806306800537688,`充值/提现,`提现,`支出,`0.07,`0.00,`system,`system,`,
    // `2018-06-30 19:24:48,`4200000120201806307131424059,`1499217242180630001009889024090250,`交易,`交易,`收入,`0.01,`0.01,`,`,`77772018063020000811,
    //  资金流水总笔数,收入笔数,收入金额,支出笔数,支出金额, `2,`1,`0.01,`1,`0.07]
    @Data
    @ApiModel("微信资金流水")
    static class WechatFundflow {
        @ApiModelProperty("记账时间 eg.2018-06-30 06:23:52")
        private LocalDateTime trxTime;
        @ApiModelProperty("微信支付业务单号 eg.10900966053622018063000406910002")
        private String wechatBizNo;
        @ApiModelProperty("资金流水单号 eg.21612433011806306800537688")
        private String wechatTrxNo;
        @ApiModelProperty("业务名称 eg.充值/提现  eg.交易")
        private String bizName;
        @ApiModelProperty("业务类型 eg.提现 eg.交易")
        private String bizType;
        @ApiModelProperty("收支类型 eg.支出 eg.收入")
        private String fundType;
        @ApiModelProperty("收支金额(元) eg.0.07")
        private BigDecimal fundAmt;
        @ApiModelProperty("账户结余(元) eg.0.01")
        private BigDecimal accountBalance;
        @ApiModelProperty("资金变更提交申请人 eg.system")
        private String proposer;
        @ApiModelProperty("备注")
        private String remark;

        @ApiModelProperty("业务凭证号[交易类型 这个是我们传过去的订单号] eg.77772018063020000811 ")
        private String bizVoucher;

    }
}
